﻿/*
 *  ChgDoc CMS - GNU General Public License, version 3 (GPL-3.0)
 *  Copyright (C)  2012. Ian Quigley
 *  
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ChgDoc.Entity;

namespace ChgDoc.Edit
{
    [AdminPage( "Sql Statements","Admin" )]
    public partial class SqlStatementList : ChgDoc.Edit.BasePage
    {
        protected override IEnumerable<FormRule> GetFormRules()
        {
            return new List<FormRuleMapping<SqlStatement>>()
		                {
                            new FormRuleMapping<SqlStatement>( txtCode, "Code", FormRuleCondition.NotNull, (s,v) => s.Code = (string)v),
                            new FormRuleMapping<SqlStatement>( txtSql, "Sql", FormRuleCondition.NotNull, (s,v) => s.Sql = (string)v),                            
                            new FormRuleMapping<SqlStatement>( txtParam, "Param", FormRuleCondition.None, (s,v) => s.Param = (string)v),
		                };
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
                return;

            UpdateDisplay();
        }

        private void UpdateDisplay()
        {
            grdList.DataSource = SqlStatement.ReadAll();
            grdList.DataBind();
			
			
        }

        protected void grdList_Edit( object source, DataGridCommandEventArgs e )
        {
            grdList.EditItemIndex = e.Item.ItemIndex;
            UpdateDisplay();
        }

        protected void grdList_Cancel( object source, DataGridCommandEventArgs e )
        {
            grdList.EditItemIndex = -1;
            UpdateDisplay();
        }

        protected void grdList_Update( object source, DataGridCommandEventArgs e )
        {
            int id = int.Parse( e.Item.Cells[ 0 ].Text );
          
            string code = ((TextBox)e.Item.Cells[ 1 ].Controls[ 0 ]).Text;
            string sql = ((TextBox)e.Item.Cells[ 2 ].Controls[ 0 ]).Text;
            string param = ((TextBox)e.Item.Cells[ 3 ].Controls[ 0 ]).Text;

            if (!string.IsNullOrWhiteSpace(code) && !string.IsNullOrWhiteSpace(sql))
                (new SqlStatement() { Id = id, Code = code, Sql = sql, Param = param }).Save();
            
            grdList.EditItemIndex = -1;
            UpdateDisplay();
        }

        protected void grdList_ItemCommand(object source, DataGridCommandEventArgs e)
        {
            long id = long.Parse(e.Item.Cells[0].Text);

            switch (e.CommandName)
            {
                case "Delete":
                    SqlStatement.Delete(id);
                    UpdateDisplay();
                    break;
            }
        }

        protected void grdList_ItemDataBound( object source, DataGridItemEventArgs e )
        {
            if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
                return;

            SqlStatement statement = (SqlStatement)e.Item.DataItem;
            string sql = statement.Sql;
            if (!string.IsNullOrWhiteSpace( sql ) && sql.Length > 30)
                sql = sql.Substring( 0, 30 ) + "...";

            e.Item.Cells[2].Text = "<a href='#' onclick='editSql(\"" + statement.Code + "\", \"" + HttpUtility.JavaScriptStringEncode(statement.Sql) +  "\"); return false;'>" + sql + "</a>";
        }

        protected void btnAdd_click( object source, EventArgs e )
        {
            SqlStatement model = new SqlStatement() { Id = LongParam( "Id" ) };

            if (!PopulateModelFromControls<SqlStatement>( model ))
                return;

            model.Save();

            UpdateDisplay();
        }
    }
}